import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

/**
 * 1.开发一个Servlet需要实现Servlet接口
 * 2.实现Servlet接口的五个方法
 */
public class HelloServlet implements Servlet {

    private int count = 0;

    /**
     * 初始化 servlet
     * 当创建 HelloServlet 时，会调用
     * 该方法只会被调用一次
     * @param servletConfig
     * @throws ServletException
     */
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("init()被调用");
    }

    /**
     * 返回ServletConfig 返回 servlet 配置
     * @return
     */
    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    /**
     * 1.service方法处理浏览器的请求(包括get/post)
     * 2.当浏览器每次请求Servlet时，就会调用一次service方法
     * 3.当Tomcat调用该方法时，会把http请求的数据封装成 实现了 ServletRequest 接口的 request 对象
     * 4.通过 ServletRequest 对象，可以得到用户提交的数据
     * 5.ServletRequest 对象可以用于返回数据给 tomcat->浏览器
     * @param servletRequest
     * @param servletResponse
     * @throws ServletException
     * @throws IOException
     */
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {

        //从 servletRequest 对象获取请求方式->没有方法
        //再 看看servletRequest的子接口有没有相关方法 ctrl + alt + b
        //httpServletRequest接口有 getMethod()方法
        //所以把 servletRequest 转成 HttpServletRequest引用(向下转型)
        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
        String method = httpServletRequest.getMethod();
        if ("GET".equals(method)) {
            //用doGet()处理Get请求
            doGet();
        } else if ("POST".equals(method)) {
            //用doPost()处理Post请求
            doPost();
        }
        count++;
        //如果count的值，在不停地累计，说明HelloServlet是单例的
        System.out.println("hi HelloServlet~ " + count);
        //Tomcat每处理一个http请求，服务器就会产生一个新的线程为其服务
        System.out.println("当前线程id" + Thread.currentThread().getId());
    }

    /**
     * 用于响应get请求
     */
    public void doGet() {
        System.out.println("doGet()被调用...");
    }

    /**
     * 用于响应post请求
     */
    public void doPost() {
        System.out.println("doPost()被调用...");
    }

    /**
     * 返回servlet信息
     * @return
     */
    @Override
    public String getServletInfo() {
        return "";
    }

    /**
     * 1.该方法是在servlet销毁时被调用的
     * 2.只会调用一次
     */
    @Override
    public void destroy() {
        System.out.println("destroy()被调用...");
    }
}
